package JVM.第06篇_垃圾回收篇;

/**
 * 安全点(Safepoint)
 * 程序执行时并非在所有地方都能停顿下来开始GC，
 * 只有在特定的位置才能停顿下来开始GC，这些位置称为 "安全点(Safepoint)"
 *
 * Safe Point的选择很重要，如果太少可能导致GC等待的时间太长，
 * 如果太频繁可能导致运行时的性能问题。
 * 大部分指令的执行时间都非常短暂，通常会根据“是否具有让程序长时间执行的特征”为标准。
 * 比如:选择一些执行时间较长的指令作为Safe Point，如方法调用、循环跳转和异常跳转等。
 *
 * 如何在GC发生时，检查所有线程都跑到最近的安全点停顿下来呢?
 * ●抢先式中断:(目前没有虚拟机采用了)
 *      首先中断所有线程。如果还有线程不在安全点，就恢复线程，让线程跑到安全点。
 * ●主动式中断:
 * 设置一个中断标志，各个线程运行到safe Point 的时候主动轮询这个标志，
 * 如果中断标志为真，则将自己进行中断挂起。
 *
 * 安全区域(Safe Region)
 * Safepoint机制保证了程序执行时，在不太长的时间内就会遇到可进入GC的Safepoint。
 * 但是，程序“不执行”的时候呢?
 * 例如线程处于 Sleep 状态或 Blocked 状态，这时候线程无法响应JVM的中断请求，
 * “走”到安全点去中断挂起，JVM也不太可能等待线程被唤醒。
 * 对于这种情况，就需要安全区域(Safe Region)来解决。
 *
 * 安全区域是指在一段代码片段中，对象的引用关系不会发生变化，在这个区域中的任何位置开始GC都是安全的。
 * 我们也可以把Safe Region 看做是被扩展了的 Safepoint。
 *
 * 实际执行时:
 * 1、当线程运行到Safe Region的代码时， 首先标识已经进入了Safe Region, 如果这段间内发生GC，
 * JVM会 忽略标识为Safe Region状态的线程:
 * 2、当线程即将离开Safe Region时， 会检查JVM是否已经完成GC， 如果完成了，则继续运行，
 * 否则线程必须等待直到收到可以安全离开Safe Region的信号为止:
 *
 */
public class H_安全点与安全区域 {

}
